// 小美有一个长度为n的数组{a1,a2,...,an}，他希望构造一个非负整数x，满足x的二进
// 制位数不超过数组中最大值的二进制位数（特别的0二进制位数为1）。
// 随后，可对数组重复进行以下操作，以使所有元素的总和最大：
// ·选择一个下标i，同时将ai修改为ai or x，将 x修改为ai and x。
// 在使元素总和达到最大值的前提下，要求所有操作前初始的尽可能小。请输出最大总和及对
// 应的最小x。
// 按位或：or表示按位或运算，即对两个整数的二进制表示的每一位进行逻辑或操作。
// 按位与：and表示按位与运算，即对两个整数的二进制表示的每一位进行逻辑与操作。

const maxArrayTransform = function (array = []) {
  if (array.length === 0) return { arrayMax: 0, xMin: 0 };

  const maxVal = Math.max(...array);
  let maxBit = 1;
  if (maxVal !== 0) maxBit = Math.floor(Math.log2(maxVal)) + 1;

  let bestArraySum = -1;
  let bestX = Infinity;

  const calOpts = function (arr = [], x) {
    let flag = true;
    let times = 0;
    const maxTimes = 99;

    while (flag && times < maxTimes) {
      flag = false;
      times++;

      for (let i = 0; i < arr.length; i++) {
        const _old = arr[i];
        const _new = _old | x;
        const newX = _old & x;

        if (_new > _old) {
          arr[i] = _new;
          x = newX;
          flag = true;
          break;
        }
      }
    }
    return arr.reduce((sum, val) => sum + val, 0);
  };

  for (let x = 0; x < 1 << maxBit; x++) {
    let arrSum = calOpts([...array], x);

    if (arrSum > bestArraySum || (arrSum === bestArraySum && x < bestX)) {
      bestArraySum = arrSum;
      bestX = x;
    }
  }

  return {
    arrayMax: bestArraySum,
    xMin: bestX,
  };
};

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const epoch = parseInt(await readline());
  for (let i = 0; i < epoch; i++) {
    // 弃用数组长度
    await readline();
    // 读取数组
    const arrayStr = await readline();
    const array = arrayStr.split(" ").map((str) => parseInt(str));
    const { arrayMax, xMin } = maxArrayTransform(array);
    console.log(`${arrayMax} ${xMin}`);
  }
})();
